package com.shen.lock8;

import java.util.concurrent.TimeUnit;

public class EightLock03 {
    public static void main(String[] args) {
        Phone03 phone=new Phone03();

        new Thread(()->{
            phone.sendSms();
        },"A").start();

        //等待
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(()->{
            phone.hello();
        },"B").start();

        /**
         * hello
         * 发短信
         */
    }
}


class Phone03{
    /**
     * 标准情况下：是先打印 【发短信】 还是 【hello】
     * 答案：hello
     * 分析：
     * 这里使用的synchronized关键字，而synchronized修饰的是方法时，锁的是调用该方法的使用者-->phone
     * 而sendSms()和call()方法都是锁phone对象，两个方法共用一把锁，只有当其中一个释放锁后才能给其他线程使用
     * 这里sendSms()方法是抱着锁睡觉的，不会释放锁
     *
     * -----
     * 这里的hello有增加了一个普通方法hello()
     * 这个hello方法并没有加上synchronized关键字，他不需要获得锁即可运行
     * 所以当sendSms()在等待的时候hello()方法就可以插队运行
     *
     */
    public synchronized void sendSms(){
        //等待
        try {
            TimeUnit.SECONDS.sleep(4);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("发短信");
    }

    public synchronized void call(){
        System.out.println("打电话");
    }

    // 没有synchronized 没有static 就是普通方式
    public void hello(){
        System.out.println("hello");
    }
}
